package com.yupi.yupicturebackend.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.yupi.yupicturebackend.model.dto.blockchain.NFTConfig;
import com.yupi.yupicturebackend.model.dto.blockchain.NFTMintResult;
import com.yupi.yupicturebackend.model.dto.blockchain.NFTTradeConfig;
import com.yupi.yupicturebackend.model.dto.blockchain.NFTTradeResult;
import com.yupi.yupicturebackend.model.entity.NFTAsset;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * NFT资产服务
 *
 * @author yupi
 */
public interface NFTAssetService extends IService<NFTAsset> {

    /**
     * 铸造NFT
     *
     * @param imageUrl 图片URL
     * @param nftConfig NFT配置
     * @param userId 用户ID
     * @return 铸造结果
     */
    NFTMintResult mintNFT(String imageUrl, NFTConfig nftConfig, Long userId);

    /**
     * 更新NFT铸造状态
     *
     * @param nftId NFT ID
     * @param mintResult 铸造结果
     * @return 是否成功
     */
    boolean updateMintStatus(String nftId, NFTMintResult mintResult);

    /**
     * 交易NFT
     *
     * @param tradeConfig 交易配置
     * @param userId 用户ID
     * @return 交易结果
     */
    NFTTradeResult tradeNFT(NFTTradeConfig tradeConfig, Long userId);

    /**
     * 获取用户NFT列表
     *
     * @param userId 用户ID
     * @param limit 限制数量
     * @return NFT列表
     */
    List<NFTAsset> getUserNFTs(Long userId, Integer limit);

    /**
     * 根据合约和代币ID获取NFT
     *
     * @param contractAddress 合约地址
     * @param tokenId 代币ID
     * @return NFT资产
     */
    NFTAsset getNFTByContractAndTokenId(String contractAddress, String tokenId);

    /**
     * 搜索NFT
     *
     * @param keyword 关键词
     * @param limit 限制数量
     * @return NFT列表
     */
    List<NFTAsset> searchNFTs(String keyword, Integer limit);

    /**
     * 按价格范围查询NFT
     *
     * @param minPrice 最低价格
     * @param maxPrice 最高价格
     * @param currency 货币单位
     * @param limit 限制数量
     * @return NFT列表
     */
    List<NFTAsset> getNFTsByPriceRange(BigDecimal minPrice, BigDecimal maxPrice, String currency, Integer limit);

    /**
     * 获取热门NFT
     *
     * @param limit 限制数量
     * @return 热门NFT列表
     */
    List<NFTAsset> getPopularNFTs(Integer limit);

    /**
     * 获取最新铸造的NFT
     *
     * @param limit 限制数量
     * @return 最新NFT列表
     */
    List<NFTAsset> getLatestMintedNFTs(Integer limit);

    /**
     * 按创作者查询NFT
     *
     * @param creator 创作者
     * @param limit 限制数量
     * @return NFT列表
     */
    List<NFTAsset> getNFTsByCreator(String creator, Integer limit);

    /**
     * 按集合查询NFT
     *
     * @param collection 集合名称
     * @param limit 限制数量
     * @return NFT列表
     */
    List<NFTAsset> getNFTsByCollection(String collection, Integer limit);

    /**
     * 按稀有度查询NFT
     *
     * @param rarity 稀有度
     * @param limit 限制数量
     * @return NFT列表
     */
    List<NFTAsset> getNFTsByRarity(String rarity, Integer limit);

    /**
     * 增加NFT浏览量
     *
     * @param nftId NFT ID
     * @return 是否成功
     */
    boolean incrementViewCount(Long nftId);

    /**
     * 增加NFT点赞量
     *
     * @param nftId NFT ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean likeNFT(Long nftId, Long userId);

    /**
     * 更新NFT价格
     *
     * @param nftId NFT ID
     * @param price 新价格
     * @param currency 货币单位
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean updateNFTPrice(Long nftId, BigDecimal price, String currency, Long userId);

    /**
     * 转移NFT所有权
     *
     * @param nftId NFT ID
     * @param newOwner 新拥有者
     * @param newOwnerAddress 新拥有者地址
     * @param userId 当前用户ID
     * @return 是否成功
     */
    boolean transferNFT(Long nftId, String newOwner, String newOwnerAddress, Long userId);

    /**
     * 获取NFT统计信息
     *
     * @param userId 用户ID（可选）
     * @return 统计信息
     */
    Map<String, Object> getNFTStatistics(Long userId);

    /**
     * 验证NFT所有权
     *
     * @param nftId NFT ID
     * @param userId 用户ID
     * @return 是否拥有
     */
    boolean verifyNFTOwnership(Long nftId, Long userId);

    /**
     * 批量铸造NFT
     *
     * @param imageUrls 图片URL列表
     * @param nftConfig NFT配置
     * @param userId 用户ID
     * @return 铸造结果列表
     */
    List<NFTMintResult> batchMintNFTs(List<String> imageUrls, NFTConfig nftConfig, Long userId);

    /**
     * 获取NFT交易历史
     *
     * @param nftId NFT ID
     * @return 交易历史
     */
    List<Map<String, Object>> getNFTTradeHistory(Long nftId);

    /**
     * 设置NFT为可交易/不可交易
     *
     * @param nftId NFT ID
     * @param tradeable 是否可交易
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean setNFTTradeable(Long nftId, Boolean tradeable, Long userId);

    /**
     * 获取推荐NFT
     *
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 推荐NFT列表
     */
    List<NFTAsset> getRecommendedNFTs(Long userId, Integer limit);
}
